1 \section{10625 - GNU's Not Unix
}
3 Se tiene un conjunto de reglas que determinan c\'omo se debe expandir una letra en
4 un acr\'onimo potencialmente recursivo. Para cada conjunto de reglas se quieren
5 responder varias consultas. Cada consulta consiste en lo siguiente: dada una
6 cadena $s$, un caracter $c$ y un natural $k$, se quiere saber cu\'antas ocurrencias
7 de $c$ hay en la cadena que resulta de expandir $k$ veces el acr\'onimos $s$.
9 \subsection{Resoluci\'on
}
11 Se trabaja con cadenas de un alfabeto $
\Sigma$.
12 Sea $\#_c(s) =
\text{cantidad de ocurrencias de $c$ en $s$
}$.
13 El problema se modela mediante una funci\'on
14 $f :
\Sigma \rightarrow \Sigma^*$ que expande las siglas, definiendo $f(x) = x$ si $x$
15 es un caracter no expandible. Se considera la extensi\'on $
\hat{f
} :
\Sigma^*
\rightarrow \Sigma^*$,
16 definida por: $
\hat{f
}(a_1
\hdots a_n) = f(a_1)
\hdots f(a_n)$.
17 Se desea conocer $\#_c(
\hat{f
}^k(s))$.
19 Sea $A = |
\Sigma|$ el tama\~no del alfabeto.
20 Se define $g :
\Nat^A
\rightarrow \Nat^A$
21 como: $g(k_1, ..., k_A)
[i
] =
\sum_{j =
1}^
{A
}{k_j
\cdot \#_
{chr(i)
}(f(chr(j)))
}$.
23 Afirmaci\'on: $g(\#_
{chr(
1)
}(s),
\hdots, \#_
{chr(A)
}(s))
[i
] = \#_
{chr(i)
}\hat{f
}(s)$.
24 Es decir, dado un vector con la cantidad de ocurrencias de cada caracter,
25 $g$ devuelve un vector con la cantidad de ocurrencias de cada caracter
26 despu\'es de expandir una vez los acr\'onimos.
29 $g(\#_
{chr(
1)
}(s),
\hdots, \#_
{chr(A)
}(s))
[i
] =
30 \sum_{j=
1}^
{A
}{\#_
{chr(j)
}(s)
\cdot \#_
{chr(i)
}{f(chr(j))
}} =
31 \sum_{t=
1}^
{n
}{\#_
{chr(i)
}{f(s_t)
}} =\\
32 = \#_
{chr(i)
}{(f(s_1)
\hdots f(s_n))
} = \#_
{chr(i)
}{\hat{f
}(s)
}$. $
\Box$
34 Entonces, es f\'acil ver que $\#_
{chr(i)
}{\hat{f
}^k(s)
} = g^k(\#_
{chr(
1)
}(s),
\hdots, \#_
{chr(A)
}(s))
[i
]$.
35 Adem\'as, $g$ es una transformaci\'on lineal, representable con una matriz, $M
\in \Nat^
{A
\times A
}$:
36 si se define $M_
{i,j
} := \#_
{chr(i)
}{f(chr(j))
}$ y $b =
\langle k_1
\hdots k_n
\rangle^t$,
37 entonces $(M
\cdot b)_
{i
}
38 =
\sum_{j=
1}^
{A
}{M_
{i,j
} \cdot k_j
}
39 = k_j
\cdot \#_
{chr(i)
}{f(chr(j))
} = g(k_1, ..., k_A)
[i
]$.
40 Por lo tanto, el problema se reduce a elevar la matriz $M$ a la $k$
41 y finalmente multiplicar por el vector $b$, que cuenta la cantidad de
42 ocurrencias de cada caracter en $s$.
44 En cuanto a la complejidad,
45 suponer que la entrada consta de $Q$ consultas.
46 La matriz $M$ es fija porque depende s\'olo de $f$, es decir de las reglas
47 para expandir los acr\'onimos.
48 Para la $i$-\'esima consulta, se calcula $M^
{k_i
} b_i$,
49 donde $k_i$ es la potencia de la $i$-\'esima consulta y
50 $b_i$ el vector de ocurrencias asociado a la cadena
53 Leer las reglas y cada una de las consultas tiene costo lineal en el tama\~no de la entrada.
54 Primero se construye la matriz $M$, de tama\~no $A^
2$. Para cada consulta,
55 se construye el vector $b_i$, de tama\~no $O(A)$.
56 Para elevar la matriz $M$ a la $k_i$ se usa el m\'etodo de potencia binaria
57 que requiere $O(
\log k_i)$ multiplicaciones de matrices. El producto de
58 matrices se implementa de la manera directa, lo cual tiene una
59 complejidad temporal de $O(A^
3)$. El producto final entre $M^
{k_i
}$ y $b_i$
62 Si el tama\~no total de la entrada es $E$, la complejidad temporal
63 en peor caso es $O(E + A^
2 +
\sum_{i=
1}^
{Q
} \log(k_i) A^
3)$.
64 Tomando $K =
\max_{i=
1}^
{Q
}{k_i
}$, esto se puede acotar por:
65 $O(E + A^
2 + Q
\log(K) A^
3)$.
66 Adem\'as, por las restricciones dadas en el enunciado sobre los
67 tama\~nos de las cadenas en la entrada, $E << A^
3$, y por lo tanto
68 la complejidad es $O(Q
\log(K) A^
3)$.
70 La complejidad espacial es $O(A^
2)$. El algoritmo de multiplicaci\'on
71 de matrices y de potencia binaria usan matrices auxiliares de tama\~no
72 $A^
2$, pero siempre una cantidad constante.
74 \subsubsection{Alternativa no implementada
}
76 Dado que $Q
\leq 10$, la complejidad temporal de $O(Q
\log(K) A^
3)$
77 es razonable y hace que la implementaci\'on sea aceptada por el
78 {\em online judge
}. Si $Q$ fuera potencialmente muy grande,
79 en lugar de calcular $M^
{k_i
}$ usando el m\'etodo de potenciaci\'on
80 binaria para cada una de las consultas separadamente, se podr\'ian calcular
81 y guardar una sola vez las matrices: $M^
1, M^
2, M^
4, ..., M^
{2^p
}$
82 (mientras $
2^p < K$). Una vez hecho esto, para responder una consulta,
83 bastar\'ia con sumar las matrices que corresponden a potencias de $
2$
84 que intervienen en la representaci\'on binaria de $k_i$. Dado que
85 sumar las matrices tiene costo $O(A^
2)$, y que la multiplicaci\'on
86 final por el vector $b_i$ tambi\'en es $O(A^
2)$, la complejidad temporal
87 de cada consulta ser\'ia $O(
\log(k_i) A^
2)$. La complejidad temporal
88 de responder todas las consultas ser\'ia $O(
\log(K) A^
3 + Q
\log(K) A^
2)$.
89 Por otro lado, la complejidad espacial aumentar\'ia a
90 $O(
\log(K) A^
2)$ porque ser\'ia necesario guardar las potencias
91 ya mencionadas de $M$.
93 \subsection{Implementación
}
98 \hlstd{}\hlline{\
1\
}\hldir{\#include\ $<$vector$>$
}\\
99 \hlline{\
2\
}\hlstd{}\hldir{\#include\ $<$cstdio$>$
}\\
100 \hlline{\
3\
}\hlstd{}\hldir{\#include\ $<$iostream$>$
}\\
101 \hlline{\
4\
}\hlstd{}\hldir{\#include\ $<$cassert$>$
}\\
102 \hlline{\
5\
}\hlstd{}\hldir{\#include\ $<$cstring$>$
}\\
103 \hlline{\
6\
}\hlstd{}\\
104 \hlline{\
7\
}\hlkwa{using\ namespace\
}\hlstd{std
}\hlsym{;
}\\
105 \hlline{\
8\
}\hlstd{}\\
106 \hlline{\
9\
}\hlkwc{typedef\
}\hlstd{}\hlkwb{unsigned\ long\ long\ int\
}\hlstd{lluint
}\hlsym{;
}\\
107 \hlline{10\
}\hlstd{}\\
108 \hlline{11\
}\hlkwc{typedef\
}\hlstd{vector
}\hlsym{$<$
}\hlstd{lluint
}\hlsym{$>$\
}\hlstd{Row
}\hlsym{;
}\\
109 \hlline{12\
}\hlstd{}\hlkwc{typedef\
}\hlstd{vector
}\hlsym{$<$
}\hlstd{Row
}\hlsym{$>$\
}\hlstd{Mat
}\hlsym{;
}\\
110 \hlline{13\
}\hlstd{}\\
111 \hlline{14\
}\hldir{\#define\ forsn(i,\ s,\ n)\ for\ (int\ i\ =\ (s);\ i\ $<$\ (n);\ i++)
}\\
112 \hlline{15\
}\hlstd{}\hldir{\#define\ forn(i,\ n)\ forsn\ (i,\
0,\ n)
}\\
113 \hlline{16\
}\hlstd{}\\
114 \hlline{17\
}\hlkwb{void\
}\hlstd{}\hlkwd{mat
\textunderscore mult
}\hlstd{}\hlsym{(
}\hlstd{}\hlkwb{const\
}\hlstd{Mat
}\hlsym{\&\
}\hlstd{m1
}\hlsym{,\
}\hlstd{}\hlkwb{const\
}\hlstd{Mat
}\hlsym{\&\
}\hlstd{m2
}\hlsym{,\
}\hlstd{Mat
}\hlsym{\&\
}\hlstd{res
}\hlsym{)\ \
{}\\
115 \hlline{18\
}\hlstd{}\hlstd{\ \ \ \
}\hlstd{}\hlkwb{const\ int\
}\hlstd{n\
}\hlsym{=\
}\hlstd{m1
}\hlsym{.
}\hlstd{}\hlkwd{size
}\hlstd{}\hlsym{();
}\\
116 \hlline{19\
}\hlstd{}\hlstd{\ \ \ \
}\hlstd{}\hlkwb{const\ int\
}\hlstd{m\
}\hlsym{=\
}\hlstd{m2
}\hlsym{.
}\hlstd{}\hlkwd{size
}\hlstd{}\hlsym{();
}\\
117 \hlline{20\
}\hlstd{}\hlstd{\ \ \ \
}\hlstd{}\hlkwb{const\ int\
}\hlstd{p\
}\hlsym{=\
}\hlstd{m2
}\hlsym{{[}}\hlstd{}\hlnum{0}\hlstd{}\hlsym{{]}.
}\hlstd{}\hlkwd{size
}\hlstd{}\hlsym{();
}\\
118 \hlline{21\
}\hlstd{}\hlstd{\ \ \ \
}\hlstd{}\hlkwd{assert
}\hlstd{}\hlsym{(
}\hlstd{m1
}\hlsym{{[}}\hlstd{}\hlnum{0}\hlstd{}\hlsym{{]}.
}\hlstd{}\hlkwd{size
}\hlstd{}\hlsym{()\ ==\
}\hlstd{m\
}\hlsym{\&\&\
}\hlstd{res
}\hlsym{.
}\hlstd{}\hlkwd{size
}\hlstd{}\hlsym{()\ ==\
}\hlstd{n\
}\hlsym{\&\&\
}\hlstd{res
}\hlsym{{[}}\hlstd{}\hlnum{0}\hlstd{}\hlsym{{]}.
}\hlstd{}\hlkwd{size
}\hlstd{}\hlsym{()\ ==\
}\hlstd{p
}\hlsym{);
}\\
119 \hlline{22\
}\hlstd{}\hlstd{\ \ \ \
}\hlstd{}\hlkwd{forn\
}\hlstd{}\hlsym{(
}\hlstd{i
}\hlsym{,\
}\hlstd{n
}\hlsym{)\
}\hlstd{}\hlkwd{forn\
}\hlstd{}\hlsym{(
}\hlstd{j
}\hlsym{,\
}\hlstd{p
}\hlsym{)\ \
{}\\
120 \hlline{23\
}\hlstd{}\hlstd{\ \ \ \ \ \ \ \
}\hlstd{lluint\ s\
}\hlsym{=\
}\hlstd{}\hlnum{0}\hlstd{}\hlsym{;
}\\
121 \hlline{24\
}\hlstd{}\hlstd{\ \ \ \ \ \ \ \
}\hlstd{}\hlkwd{forn\
}\hlstd{}\hlsym{(
}\hlstd{k
}\hlsym{,\
}\hlstd{m
}\hlsym{)\
}\hlstd{s\
}\hlsym{+=\
}\hlstd{m1
}\hlsym{{[}}\hlstd{i
}\hlsym{{]}{[}}\hlstd{k
}\hlsym{{]}\
{*
}\
}\hlstd{m2
}\hlsym{{[}}\hlstd{k
}\hlsym{{]}{[}}\hlstd{j
}\hlsym{{]};
}\\
122 \hlline{25\
}\hlstd{}\hlstd{\ \ \ \ \ \ \ \
}\hlstd{res
}\hlsym{{[}}\hlstd{i
}\hlsym{{]}{[}}\hlstd{j
}\hlsym{{]}\ =\
}\hlstd{s
}\hlsym{;
}\\
123 \hlline{26\
}\hlstd{}\hlstd{\ \ \ \
}\hlstd{}\hlsym{\
}}\\
124 \hlline{27\
}\hlstd{}\hlsym{\
}}\\
125 \hlline{28\
}\hlstd{}\\
126 \hlline{29\
}\hlkwb{void\
}\hlstd{}\hlkwd{mat
\textunderscore identity
}\hlstd{}\hlsym{(
}\hlstd{Mat
}\hlsym{\&\
}\hlstd{mt
}\hlsym{)\ \
{}\\
127 \hlline{30\
}\hlstd{}\hlstd{\ \ \ \
}\hlstd{}\hlkwb{const\ int\
}\hlstd{n\
}\hlsym{=\
}\hlstd{mt
}\hlsym{.
}\hlstd{}\hlkwd{size
}\hlstd{}\hlsym{();
}\\
128 \hlline{31\
}\hlstd{}\hlstd{\ \ \ \
}\hlstd{}\hlkwd{assert
}\hlstd{}\hlsym{(
}\hlstd{n\
}\hlsym{==\
}\hlstd{mt
}\hlsym{{[}}\hlstd{}\hlnum{0}\hlstd{}\hlsym{{]}.
}\hlstd{}\hlkwd{size
}\hlstd{}\hlsym{());
}\\
129 \hlline{32\
}\hlstd{}\hlstd{\ \ \ \
}\hlstd{}\hlkwd{forn\
}\hlstd{}\hlsym{(
}\hlstd{i
}\hlsym{,\
}\hlstd{n
}\hlsym{)\
}\hlstd{}\hlkwd{forn\
}\hlstd{}\hlsym{(
}\hlstd{j
}\hlsym{,\
}\hlstd{n
}\hlsym{)\ \
{}\\
130 \hlline{33\
}\hlstd{}\hlstd{\ \ \ \ \ \ \ \
}\hlstd{mt
}\hlsym{{[}}\hlstd{i
}\hlsym{{]}{[}}\hlstd{j
}\hlsym{{]}\ =\
}\hlstd{i\
}\hlsym{==\
}\hlstd{j
}\hlsym{;
}\\
131 \hlline{34\
}\hlstd{}\hlstd{\ \ \ \
}\hlstd{}\hlsym{\
}}\\
132 \hlline{35\
}\hlstd{}\hlsym{\
}}\\
133 \hlline{36\
}\hlstd{}\\
134 \hlline{37\
}\hlkwb{void\
}\hlstd{}\hlkwd{mat
\textunderscore copy
}\hlstd{}\hlsym{(
}\hlstd{}\hlkwb{const\
}\hlstd{Mat
}\hlsym{\&\
}\hlstd{in
}\hlsym{,\
}\hlstd{Mat
}\hlsym{\&\
}\hlstd{out
}\hlsym{)\ \
{}\\
135 \hlline{38\
}\hlstd{}\hlstd{\ \ \ \
}\hlstd{}\hlkwb{const\ int\
}\hlstd{n\
}\hlsym{=\
}\hlstd{in
}\hlsym{.
}\hlstd{}\hlkwd{size
}\hlstd{}\hlsym{();
}\\
136 \hlline{39\
}\hlstd{}\hlstd{\ \ \ \
}\hlstd{}\hlkwb{const\ int\
}\hlstd{m\
}\hlsym{=\
}\hlstd{in
}\hlsym{{[}}\hlstd{}\hlnum{0}\hlstd{}\hlsym{{]}.
}\hlstd{}\hlkwd{size
}\hlstd{}\hlsym{();
}\\
137 \hlline{40\
}\hlstd{}\hlstd{\ \ \ \
}\hlstd{}\hlkwd{assert
}\hlstd{}\hlsym{(
}\hlstd{out
}\hlsym{.
}\hlstd{}\hlkwd{size
}\hlstd{}\hlsym{()\ ==\
}\hlstd{in
}\hlsym{.
}\hlstd{}\hlkwd{size
}\hlstd{}\hlsym{()\ \&\&\
}\hlstd{out
}\hlsym{{[}}\hlstd{}\hlnum{0}\hlstd{}\hlsym{{]}.
}\hlstd{}\hlkwd{size
}\hlstd{}\hlsym{()\ ==\
}\hlstd{in
}\hlsym{{[}}\hlstd{}\hlnum{0}\hlstd{}\hlsym{{]}.
}\hlstd{}\hlkwd{size
}\hlstd{}\hlsym{());
}\\
138 \hlline{41\
}\hlstd{}\hlstd{\ \ \ \
}\hlstd{}\hlkwd{forn\
}\hlstd{}\hlsym{(
}\hlstd{i
}\hlsym{,\
}\hlstd{n
}\hlsym{)\
}\hlstd{}\hlkwd{forn\
}\hlstd{}\hlsym{(
}\hlstd{j
}\hlsym{,\
}\hlstd{m
}\hlsym{)\
}\hlstd{out
}\hlsym{{[}}\hlstd{i
}\hlsym{{]}{[}}\hlstd{j
}\hlsym{{]}\ =\
}\hlstd{in
}\hlsym{{[}}\hlstd{i
}\hlsym{{]}{[}}\hlstd{j
}\hlsym{{]};
}\\
139 \hlline{42\
}\hlstd{}\hlsym{\
}}\\
140 \hlline{43\
}\hlstd{}\\
141 \hlline{44\
}\hlkwb{void\
}\hlstd{}\hlkwd{mat
\textunderscore pow
}\hlstd{}\hlsym{(
}\hlstd{}\hlkwb{const\
}\hlstd{Mat
}\hlsym{\&\
}\hlstd{mt
}\hlsym{,\
}\hlstd{}\hlkwb{int\
}\hlstd{pow
}\hlsym{,\
}\hlstd{Mat
}\hlsym{\&\
}\hlstd{res
}\hlsym{)\ \
{}\\
142 \hlline{45\
}\hlstd{}\hlstd{\ \ \ \
}\hlstd{}\hlkwb{const\ int\
}\hlstd{n\
}\hlsym{=\
}\hlstd{mt
}\hlsym{.
}\hlstd{}\hlkwd{size
}\hlstd{}\hlsym{();
}\\
143 \hlline{46\
}\hlstd{}\hlstd{\ \ \ \
}\hlstd{vector
}\hlsym{$<$
}\hlstd{Mat
}\hlsym{$>$\
}\hlstd{}\hlkwd{acc
}\hlstd{}\hlsym{(
}\hlstd{}\hlnum{2}\hlstd{}\hlsym{,\
}\hlstd{}\hlkwd{Mat
}\hlstd{}\hlsym{(
}\hlstd{n
}\hlsym{,\
}\hlstd{}\hlkwd{Row
}\hlstd{}\hlsym{(
}\hlstd{n
}\hlsym{,\
}\hlstd{}\hlnum{0}\hlstd{}\hlsym{)));
}\\
144 \hlline{47\
}\hlstd{}\hlstd{\ \ \ \
}\hlstd{}\hlkwd{mat
\textunderscore identity
}\hlstd{}\hlsym{(
}\hlstd{res
}\hlsym{);
}\\
145 \hlline{48\
}\hlstd{}\hlstd{\ \ \ \
}\hlstd{}\hlkwd{mat
\textunderscore copy
}\hlstd{}\hlsym{(
}\hlstd{mt
}\hlsym{,\
}\hlstd{acc
}\hlsym{{[}}\hlstd{}\hlkwa{false
}\hlstd{}\hlsym{{]});
}\\
146 \hlline{49\
}\hlstd{}\hlstd{\ \ \ \
}\hlstd{}\hlkwb{bool\
}\hlstd{cur\
}\hlsym{=\
}\hlstd{}\hlkwa{false
}\hlstd{}\hlsym{;
}\\
147 \hlline{50\
}\hlstd{}\hlstd{\ \ \ \
}\hlstd{}\hlkwa{for\
}\hlstd{}\hlsym{(;;)\ \
{}\\
148 \hlline{51\
}\hlstd{}\hlstd{\ \ \ \ \ \ \ \
}\hlstd{}\hlkwa{if\
}\hlstd{}\hlsym{(
}\hlstd{pow\
}\hlsym{\&\
}\hlstd{}\hlnum{1}\hlstd{}\hlsym{)\ \
{}\\
149 \hlline{52\
}\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \
}\hlstd{}\hlkwd{mat
\textunderscore copy
}\hlstd{}\hlsym{(
}\hlstd{res
}\hlsym{,\
}\hlstd{acc
}\hlsym{{[}!
}\hlstd{cur
}\hlsym{{]});
}\\
150 \hlline{53\
}\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \
}\hlstd{}\hlkwd{mat
\textunderscore mult
}\hlstd{}\hlsym{(
}\hlstd{acc
}\hlsym{{[}!
}\hlstd{cur
}\hlsym{{]},\
}\hlstd{acc
}\hlsym{{[}}\hlstd{cur
}\hlsym{{]},\
}\hlstd{res
}\hlsym{);
}\\
151 \hlline{54\
}\hlstd{}\hlstd{\ \ \ \ \ \ \ \
}\hlstd{}\hlsym{\
}}\\
152 \hlline{55\
}\hlstd{}\hlstd{\ \ \ \ \ \ \ \
}\hlstd{pow\
}\hlsym{$>$$>$=\
}\hlstd{}\hlnum{1}\hlstd{}\hlsym{;
}\\
153 \hlline{56\
}\hlstd{}\hlstd{\ \ \ \ \ \ \ \
}\hlstd{}\hlkwa{if\
}\hlstd{}\hlsym{(
}\hlstd{pow\
}\hlsym{==\
}\hlstd{}\hlnum{0}\hlstd{}\hlsym{)\
}\hlstd{}\hlkwa{break
}\hlstd{}\hlsym{;
}\\
154 \hlline{57\
}\hlstd{}\hlstd{\ \ \ \ \ \ \ \
}\hlstd{}\hlkwd{mat
\textunderscore mult
}\hlstd{}\hlsym{(
}\hlstd{acc
}\hlsym{{[}}\hlstd{cur
}\hlsym{{]},\
}\hlstd{acc
}\hlsym{{[}}\hlstd{cur
}\hlsym{{]},\
}\hlstd{acc
}\hlsym{{[}!
}\hlstd{cur
}\hlsym{{]});
}\\
155 \hlline{58\
}\hlstd{}\hlstd{\ \ \ \ \ \ \ \
}\hlstd{cur\
}\hlsym{=\ !
}\hlstd{cur
}\hlsym{;
}\\
156 \hlline{59\
}\hlstd{}\hlstd{\ \ \ \
}\hlstd{}\hlsym{\
}}\\
157 \hlline{60\
}\hlstd{}\hlsym{\
}}\\
158 \hlline{61\
}\hlstd{}\\
159 \hlline{62\
}\hlkwb{void\
}\hlstd{}\hlkwd{mat
\textunderscore print
}\hlstd{}\hlsym{(
}\hlstd{}\hlkwb{const\
}\hlstd{Mat
}\hlsym{\&\
}\hlstd{mt
}\hlsym{)\ \
{}\\
160 \hlline{63\
}\hlstd{}\hlstd{\ \ \ \
}\hlstd{}\hlkwb{const\ int\
}\hlstd{n\
}\hlsym{=\
}\hlstd{mt
}\hlsym{.
}\hlstd{}\hlkwd{size
}\hlstd{}\hlsym{();
}\\
161 \hlline{64\
}\hlstd{}\hlstd{\ \ \ \
}\hlstd{}\hlkwb{const\ int\
}\hlstd{m\
}\hlsym{=\
}\hlstd{mt
}\hlsym{{[}}\hlstd{}\hlnum{0}\hlstd{}\hlsym{{]}.
}\hlstd{}\hlkwd{size
}\hlstd{}\hlsym{();
}\\
162 \hlline{65\
}\hlstd{}\hlstd{\ \ \ \
}\hlstd{}\hlkwd{forn\
}\hlstd{}\hlsym{(
}\hlstd{i
}\hlsym{,\
}\hlstd{n
}\hlsym{)\ \
{}\\
163 \hlline{66\
}\hlstd{}\hlstd{\ \ \ \ \ \ \ \
}\hlstd{}\hlkwd{forn\
}\hlstd{}\hlsym{(
}\hlstd{j
}\hlsym{,\
}\hlstd{m
}\hlsym{)\ \
{}\\
164 \hlline{67\
}\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \
}\hlstd{cout\
}\hlsym{$<$$<$\
}\hlstd{mt
}\hlsym{{[}}\hlstd{i
}\hlsym{{]}{[}}\hlstd{j
}\hlsym{{]}\ $<$$<$\
}\hlstd{}\hlstr{"\ "
}\hlstd{}\hlsym{;
}\\
165 \hlline{68\
}\hlstd{}\hlstd{\ \ \ \ \ \ \ \
}\hlstd{}\hlsym{\
}}\\
166 \hlline{69\
}\hlstd{}\hlstd{\ \ \ \ \ \ \ \
}\hlstd{cout\
}\hlsym{$<$$<$\
}\hlstd{endl
}\hlsym{;
}\\
167 \hlline{70\
}\hlstd{}\hlstd{\ \ \ \
}\hlstd{}\hlsym{\
}}\\
168 \hlline{71\
}\hlstd{}\hlsym{\
}}\\
169 \hlline{72\
}\hlstd{}\\
170 \hlline{73\
}\hldir{\#define\ MIN
\textunderscore CHAR\
32}\\
171 \hlline{74\
}\hlstd{}\hldir{\#define\ MAX
\textunderscore CHAR\
127}\\
172 \hlline{75\
}\hlstd{}\hldir{\#define\ N
}\hlstd{\ \
}\hldir{(MAX
\textunderscore CHAR\
{-
}\ MIN
\textunderscore CHAR\ +\
1)
}\\
173 \hlline{76\
}\hlstd{}\\
174 \hlline{77\
}\hldir{\#define\ in
\textunderscore range(Char)\ (MIN
\textunderscore CHAR\ $<$=\ (Char)\ $<$=\ MAX
\textunderscore CHAR)
}\\
175 \hlline{78\
}\hlstd{}\hldir{\#define\ charcode(Char)\ ((Char)\
{-
}\ MIN
\textunderscore CHAR)
}\\
176 \hlline{79\
}\hlstd{}\\
177 \hlline{80\
}\hldir{\#define\ Max
\textunderscore rule\
1024}\\
178 \hlline{81\
}\hlstd{}\hlkwb{int\
}\hlstd{}\hlkwd{main
}\hlstd{}\hlsym{()\ \
{}\\
179 \hlline{82\
}\hlstd{}\hlstd{\ \ \ \
}\hlstd{}\hlkwb{int\
}\hlstd{ncases
}\hlsym{;
}\\
180 \hlline{83\
}\hlstd{}\hlstd{\ \ \ \
}\hlstd{}\hlkwb{char\
}\hlstd{buf
}\hlsym{{[}}\hlstd{Max
\textunderscore rule
}\hlsym{{]};
}\\
181 \hlline{84\
}\hlstd{}\hlstd{\ \ \ \
}\hlstd{}\hlkwb{char\
}\hlstd{chr
}\hlsym{;
}\\
182 \hlline{85\
}\hlstd{}\hlstd{\ \ \ \
}\hlstd{}\hlkwd{scanf
}\hlstd{}\hlsym{(
}\hlstd{}\hlstr{"\%u
}\hlesc{$
\backslash$n
}\hlstr{"
}\hlstd{}\hlsym{,\ \&
}\hlstd{ncases
}\hlsym{);
}\\
183 \hlline{86\
}\hlstd{}\hlstd{\ \ \ \
}\hlstd{}\hlkwd{forn\
}\hlstd{}\hlsym{(
}\hlstd{ci
}\hlsym{,\
}\hlstd{ncases
}\hlsym{)\ \
{}\\
184 \hlline{87\
}\hlstd{}\hlstd{\ \ \ \ \ \ \ \
}\hlstd{}\hlkwb{int\
}\hlstd{nrules
}\hlsym{;
}\\
185 \hlline{88\
}\hlstd{}\hlstd{\ \ \ \ \ \ \ \
}\hlstd{}\hlkwd{scanf
}\hlstd{}\hlsym{(
}\hlstd{}\hlstr{"\%u
}\hlesc{$
\backslash$n
}\hlstr{"
}\hlstd{}\hlsym{,\ \&
}\hlstd{nrules
}\hlsym{);
}\\
186 \hlline{89\
}\hlstd{\\
187 \hlline{90\
}}\hlstd{\ \ \ \ \ \ \ \
}\hlstd{}\hlslc{//\ rules
{[}i
{]}{[}j
{]}\ =\ cantidad\ de\ ocurrencias\ de\ Ai\ en\ la\ regla\ Aj\
{-
}$>$\ ...
}\\
188 \hlline{91\
}\hlstd{}\hlstd{\ \ \ \ \ \ \ \
}\hlstd{Mat\
}\hlkwd{rules
}\hlstd{}\hlsym{(
}\hlstd{N
}\hlsym{,\
}\hlstd{}\hlkwd{Row
}\hlstd{}\hlsym{(
}\hlstd{N
}\hlsym{,\
}\hlstd{}\hlnum{0}\hlstd{}\hlsym{));
}\\
189 \hlline{92\
}\hlstd{\\
190 \hlline{93\
}}\hlstd{\ \ \ \ \ \ \ \
}\hlstd{}\hlkwd{mat
\textunderscore identity
}\hlstd{}\hlsym{(
}\hlstd{rules
}\hlsym{);
}\\
191 \hlline{94\
}\hlstd{}\hlstd{\ \ \ \ \ \ \ \
}\hlstd{}\hlkwd{forn\
}\hlstd{}\hlsym{(
}\hlstd{ri
}\hlsym{,\
}\hlstd{nrules
}\hlsym{)\ \
{}\\
192 \hlline{95\
}\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \
}\hlstd{}\hlkwd{scanf
}\hlstd{}\hlsym{(
}\hlstd{}\hlstr{"\%c
{-
}$>$\%s
}\hlesc{$
\backslash$n
}\hlstr{"
}\hlstd{}\hlsym{,\ \&
}\hlstd{chr
}\hlsym{,\
}\hlstd{buf
}\hlsym{);
}\\
193 \hlline{96\
}\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \
}\hlstd{}\hlkwd{assert
}\hlstd{}\hlsym{(
}\hlstd{}\hlkwd{in
\textunderscore range
}\hlstd{}\hlsym{(
}\hlstd{chr
}\hlsym{));
}\\
194 \hlline{97\
}\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \
}\hlstd{}\hlkwd{forn\
}\hlstd{}\hlsym{(
}\hlstd{i
}\hlsym{,\
}\hlstd{N
}\hlsym{)\
}\hlstd{rules
}\hlsym{{[}}\hlstd{i
}\hlsym{{]}{[}}\hlstd{}\hlkwd{charcode
}\hlstd{}\hlsym{(
}\hlstd{chr
}\hlsym{)
{]}\ =\
}\hlstd{}\hlnum{0}\hlstd{}\hlsym{;
}\\
195 \hlline{98\
}\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \
}\hlstd{}\hlkwb{const\ int\
}\hlstd{rule
\textunderscore len\
}\hlsym{=\
}\hlstd{}\hlkwd{strlen
}\hlstd{}\hlsym{(
}\hlstd{buf
}\hlsym{);
}\\
196 \hlline{99\
}\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \
}\hlstd{}\hlkwd{forn\
}\hlstd{}\hlsym{(
}\hlstd{i
}\hlsym{,\
}\hlstd{rule
\textunderscore len
}\hlsym{)\ \
{}\\
197 \hlline{100\
}\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \
}\hlstd{}\hlkwd{assert
}\hlstd{}\hlsym{(
}\hlstd{}\hlkwd{in
\textunderscore range
}\hlstd{}\hlsym{(
}\hlstd{buf
}\hlsym{{[}}\hlstd{i
}\hlsym{{]}));
}\\
198 \hlline{101\
}\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \
}\hlstd{rules
}\hlsym{{[}}\hlstd{}\hlkwd{charcode
}\hlstd{}\hlsym{(
}\hlstd{buf
}\hlsym{{[}}\hlstd{i
}\hlsym{{]})
{]}{[}}\hlstd{}\hlkwd{charcode
}\hlstd{}\hlsym{(
}\hlstd{chr
}\hlsym{)
{]}++;
}\\
199 \hlline{102\
}\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \
}\hlstd{}\hlsym{\
}}\\
200 \hlline{103\
}\hlstd{}\hlstd{\ \ \ \ \ \ \ \
}\hlstd{}\hlsym{\
}}\\
201 \hlline{104\
}\hlstd{\\
202 \hlline{105\
}}\hlstd{\ \ \ \ \ \ \ \
}\hlstd{}\hlkwb{int\
}\hlstd{nqueries
}\hlsym{;
}\\
203 \hlline{106\
}\hlstd{}\hlstd{\ \ \ \ \ \ \ \
}\hlstd{}\hlkwb{int\
}\hlstd{pow
}\hlsym{;
}\\
204 \hlline{107\
}\hlstd{}\hlstd{\ \ \ \ \ \ \ \
}\hlstd{}\hlkwd{scanf
}\hlstd{}\hlsym{(
}\hlstd{}\hlstr{"\%u
}\hlesc{$
\backslash$n
}\hlstr{"
}\hlstd{}\hlsym{,\ \&
}\hlstd{nqueries
}\hlsym{);
}\\
205 \hlline{108\
}\hlstd{}\hlstd{\ \ \ \ \ \ \ \
}\hlstd{}\hlkwd{forn\
}\hlstd{}\hlsym{(
}\hlstd{qi
}\hlsym{,\
}\hlstd{nqueries
}\hlsym{)\ \
{}\\
206 \hlline{109\
}\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \
}\hlstd{Mat\
}\hlkwd{input
}\hlstd{}\hlsym{(
}\hlstd{N
}\hlsym{,\
}\hlstd{}\hlkwd{Row
}\hlstd{}\hlsym{(
}\hlstd{}\hlnum{1}\hlstd{}\hlsym{,\
}\hlstd{}\hlnum{0}\hlstd{}\hlsym{));
}\\
207 \hlline{110\
}\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \
}\hlstd{}\hlkwd{scanf
}\hlstd{}\hlsym{(
}\hlstd{}\hlstr{"\%s\ \%c\ \%u
}\hlesc{$
\backslash$n
}\hlstr{"
}\hlstd{}\hlsym{,\
}\hlstd{buf
}\hlsym{,\ \&
}\hlstd{chr
}\hlsym{,\ \&
}\hlstd{pow
}\hlsym{);
}\\
208 \hlline{111\
}\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \
}\hlstd{}\hlslc{//\ procesar\ regla
}\\
209 \hlline{112\
}\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \
}\hlstd{}\hlkwb{const\ int\
}\hlstd{input
\textunderscore len\
}\hlsym{=\
}\hlstd{}\hlkwd{strlen
}\hlstd{}\hlsym{(
}\hlstd{buf
}\hlsym{);
}\\
210 \hlline{113\
}\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \
}\hlstd{}\hlkwd{forn\
}\hlstd{}\hlsym{(
}\hlstd{i
}\hlsym{,\
}\hlstd{input
\textunderscore len
}\hlsym{)\ \
{}\\
211 \hlline{114\
}\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \
}\hlstd{}\hlkwd{assert
}\hlstd{}\hlsym{(
}\hlstd{}\hlkwd{in
\textunderscore range
}\hlstd{}\hlsym{(
}\hlstd{buf
}\hlsym{{[}}\hlstd{i
}\hlsym{{]}));
}\\
212 \hlline{115\
}\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \
}\hlstd{input
}\hlsym{{[}}\hlstd{}\hlkwd{charcode
}\hlstd{}\hlsym{(
}\hlstd{buf
}\hlsym{{[}}\hlstd{i
}\hlsym{{]})
{]}{[}}\hlstd{}\hlnum{0}\hlstd{}\hlsym{{]}++;
}\\
213 \hlline{116\
}\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \
}\hlstd{}\hlsym{\
}}\\
214 \hlline{117\
}\hlstd{\\
215 \hlline{118\
}}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \
}\hlstd{Mat\
}\hlkwd{pow
\textunderscore rules
}\hlstd{}\hlsym{(
}\hlstd{N
}\hlsym{,\
}\hlstd{}\hlkwd{Row
}\hlstd{}\hlsym{(
}\hlstd{N
}\hlsym{,\
}\hlstd{}\hlnum{0}\hlstd{}\hlsym{));
}\\
216 \hlline{119\
}\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \
}\hlstd{}\hlkwd{mat
\textunderscore pow
}\hlstd{}\hlsym{(
}\hlstd{rules
}\hlsym{,\
}\hlstd{pow
}\hlsym{,\
}\hlstd{pow
\textunderscore rules
}\hlsym{);
}\\
217 \hlline{120\
}\hlstd{\\
218 \hlline{121\
}}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \
}\hlstd{Mat\
}\hlkwd{result
}\hlstd{}\hlsym{(
}\hlstd{N
}\hlsym{,\
}\hlstd{}\hlkwd{Row
}\hlstd{}\hlsym{(
}\hlstd{}\hlnum{1}\hlstd{}\hlsym{,\
}\hlstd{}\hlnum{0}\hlstd{}\hlsym{));
}\\
219 \hlline{122\
}\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \
}\hlstd{}\hlkwd{mat
\textunderscore mult
}\hlstd{}\hlsym{(
}\hlstd{pow
\textunderscore rules
}\hlsym{,\
}\hlstd{input
}\hlsym{,\
}\hlstd{result
}\hlsym{);
}\\
220 \hlline{123\
}\hlstd{\\
221 \hlline{124\
}}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \
}\hlstd{cout\
}\hlsym{$<$$<$\
}\hlstd{result
}\hlsym{{[}}\hlstd{}\hlkwd{charcode
}\hlstd{}\hlsym{(
}\hlstd{chr
}\hlsym{)
{]}{[}}\hlstd{}\hlnum{0}\hlstd{}\hlsym{{]}\ $<$$<$\
}\hlstd{endl
}\hlsym{;
}\\
222 \hlline{125\
}\hlstd{}\hlstd{\ \ \ \ \ \ \ \
}\hlstd{}\hlsym{\
}}\\
223 \hlline{126\
}\hlstd{}\hlstd{\ \ \ \
}\hlstd{}\hlsym{\
}}\\
224 \hlline{127\
}\hlstd{}\hlstd{\ \ \ \
}\hlstd{}\hlkwa{return\
}\hlstd{}\hlnum{0}\hlstd{}\hlsym{;
}\\
225 \hlline{128\
}\hlstd{}\hlsym{\
}}\hlstd{}\\